package com.gxa.hualianeshop.service.impl;

import com.gxa.hualianeshop.common.base.RedisKeys;
import com.gxa.hualianeshop.entity.pojo.CartItem;
import com.gxa.hualianeshop.entity.pojo.Sku;
import com.gxa.hualianeshop.service.CartService;
import com.gxa.hualianeshop.service.SkuService;
import org.apache.dubbo.config.annotation.Reference;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Map;

/**
 * @author bill
 * @date 2023/7/27 10:41
 */
@org.apache.dubbo.config.annotation.Service
public class CartServiceImpl implements CartService {

    @Autowired
    RedissonClient redissonClient;

//    要获取sku商品信息, 通过远程调用SkuService
    @Reference
    SkuService skuService;

    @Override
    public void addGoodsToCart(Long userId, Long skuId, Integer num) {
        RMap<Object, Object> cart = redissonClient.getMap(RedisKeys.CART_KEY + userId);

        // 通过skuId获取sku商品的基本信息
        Sku sku = skuService.getById(skuId);

        // 判断该用户的购物车中是否存在指定skuId商品购物项
        // 如果存在, 则num+当前的新购买数量
        Object o = cart.get(skuId);
        if(o != null){
            // 取出CartItem对象
            CartItem  item= (CartItem) o;
            // 修改数量
            item.setNum(item.getNum()+num);

            // 修改小计
            item.setTotalPrice(item.getPrice()*item.getNum());

            // 存回redis
            cart.put(skuId,item);
        }else{
            // 构建一个CartItem对象, 所需的商品信息是通过sku远程调用获取
            CartItem cartItem = new CartItem();
            cartItem.setNum(num);
            cartItem.setSkuId(skuId);
            cartItem.setPrice(sku.getPrice());
            cartItem.setName(sku.getName());
            cartItem.setTotalPrice(sku.getPrice()*num);

            // 完成购物车的添加
            cart.put(skuId,cartItem);
        }




    }

    @Override
    public void updateCartItemNum(Long userId, Long skuId, Integer num) {

    }

    @Override
    public Boolean removeCartItem(Long userId, Long skuId) {
        RMap<Object, Object> cart = redissonClient.getMap(RedisKeys.CART_KEY + userId);
        // 通过指定的skuId删除购物项CartItem
        Object remove = cart.remove(skuId);

        // 根据删除的目标购物项是否为null 返回删除成功的判断
        return remove!=null;
    }

    @Override
    public void clearCart(Long userId) {

    }

    @Override
    public CartItem queryUserCartItem(Long userId, Long skuId) {
        RMap<Object, Object> cart = redissonClient.getMap(RedisKeys.CART_KEY + userId);
        return (CartItem) cart.get(skuId);
    }

    @Override
    public Map queryUserCart(Long userId) {
        return null;
    }
}
